package org.sundatagroup.aurora.monitor.service;

import java.util.HashMap;

import org.springframework.stereotype.Service;
import org.sundatagroup.aurora.monitor.entity.ScreenEntry;
import org.sundatagroup.aurora.monitor.entity.player.PlayerParam;
import org.sundatagroup.aurora.monitor.entity.pojo.PlayList;
import org.sundatagroup.aurora.show.entity.status.IStatusEntity;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

/**
 * <b>监控区展示屏相关的数据服务</b>
 * <p>存储展示屏相关数据、状态等
 * </p>
 * 
 * @author Zdream
 * @date 2018-05-28
 * @since 0.2.0
 */
@Service
public class ScreenBatches {

	/*
	 * 展示屏数据映射关系是: sid - Entry
	 */
	HashMap<String, ScreenEntry> map = new HashMap<>();
	
	public void addScreen(IStatusEntity status) {
		ScreenEntry entry = new ScreenEntry(status);
		map.put(status.getSid(), entry);
	}
	
	public void removeScreen(String sid) {
		map.remove(sid);
	}
	
	/**
	 * 返回对应屏幕的展示状态
	 * @param sid
	 * @return
	 *   可能为空
	 */
	public IStatusEntity queryStatus(String sid) {
		return map.get(sid).getStatus();
	}
	
	/**
	 * 更新状态
	 * @param sid
	 * @param status
	 *   展示屏状态
	 * @param connect
	 *   是否在连接状态
	 */
	public void updateStatus(String sid, IStatusEntity status, boolean connect) {
		if (status == null) {
			throw new NullPointerException("状态数据不能为 null");
		}
		
		ScreenEntry entry = map.get(sid);
		
		// 会报 NullPointerException, 属正常情况
		entry.setStatus(status);
		entry.setConnect(connect);
	}
	
	/**
	 * 所有屏幕显示详细信息查询, 并返回 Json 数据格式.
	 * 这里包含所有的展示屏状态数据, 以及播放列表状态数据<br>
	 * 
	 * @return 返回 JsonArray, 每一项包含:
	 * {
	 *    sid : 屏幕 ID,
	 *    player : 播放列表状态数据,
	 *    其它 : 展示屏状态数据
	 * };
	 */
	public JsonArray transformAll() {
		JsonArray array = new JsonArray();
		
		map.entrySet().forEach((item) -> {
			array.add(item.getValue().toJson());
		});
		
		return array;
	}
	
	/**
	 * 返回指定屏幕状态, 并转成 Json 数据格式.
	 * 这里包含所有的展示屏状态数据, 以及播放列表状态数据<br>
	 * 
	 * @param sid
	 *   屏幕 ID
	 * @return
	 * {
	 *    sid : 屏幕 ID,
	 *    player : 播放列表状态数据,
	 *    其它 : 展示屏状态数据
	 * };
	 */
	public JsonObject transform(String sid) {
		return map.get(sid).toJson();
	}
	
	/**
	 * 更新屏幕对应的播放列表, 并将接下来要播放的索引指向开始.
	 * @param sid
	 * @param playList
	 *   播放列表, 允许为 null
	 * @throws NullPointerException
	 *   如果没有存储 sid 对应的展示屏时
	 */
	public void updatePlayList(String sid, PlayList playList) {
		ScreenEntry entry = map.get(sid);
		PlayerParam param = entry.getParam();
		
		// 修改播放列表
		param.setPlayList(playList);
		// 修改播放的位置
		param.setCurrent(-1);
	}
	
	/**
	 * 获得指定屏幕对应的播放列表
	 * @param sid
	 * @return
	 *   播放列表, 可能为 null
	 * @throws NullPointerException
	 *   如果没有存储 sid 对应的展示屏时
	 */
	public PlayList getPlayList(String sid) {
		ScreenEntry entry = map.get(sid);
		return entry.getPlayList();
	}
	
	/**
	 * 获得指定屏幕对应的播放参数
	 * @param sid
	 * @return
	 *   不可能为 null
	 * @throws NullPointerException
	 *   如果没有存储 sid 对应的展示屏时
	 */
	public PlayerParam getPlayerParam(String sid) {
		ScreenEntry entry = map.get(sid);
		return entry.getParam();
	}
	
}
